﻿using Util.ExtensionMethods;
using ByBikeShop.Site;
using SupportLayer.Constantes.CLIENTE;
using SupportLayer.Constantes.PRODUTO;
using SupportLayer.Objetos.Cliente;
using SupportLayer.Objetos.Produto;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Uol.PagSeguro.Domain;
using Uol.PagSeguro.Constants;
using Uol.PagSeguro.Resources;
using System.Net;
using System.IO;
using PersistenceLayer.Model;
using PersistenceLayer.DAL;
using SupportLayer.Constantes.OUTROS;
using SupportLayer.Constantes;

namespace ByBikeShop.Cliente.Pages
{
	public partial class Carrinho : BasePage
	{
		protected void Page_Load(object sender, EventArgs e)
		{
			base.PageLoad();

			if ((Cli == null) || (Cli.ID <= 0))
				Response.Redirect("/Cliente/Pages/Login.aspx");

			if (!IsPostBack)
				PopulaGrid();
		}

		public override void CarregaDados()
		{
		}
		private void PopulaGrid()
		{
			DataTable dt = new DataTable();
			dt.Columns.Add("ID");
			dt.Columns.Add("ImagemProduto");
			dt.Columns.Add("NomeProduto");
			dt.Columns.Add("precoUnitario");
			dt.Columns.Add("descontoUnitario");
			dt.Columns.Add("precoTotal");

			decimal total = 0;

			foreach (Carrinho_Produtos cp in new Carrinho_ProdutosDAL().ListarPorCliente(Cli.ID))
			{
				string desconto = "";
				decimal precoTotal = cp.Produto_Especificacao.Produto.Preco;

				if ((cp.Produto_Especificacao.Produto.Produto_Promocao == null) || (cp.Produto_Especificacao.Produto.Produto_Promocao.Count <= 0))
				{
					total += cp.Produto_Especificacao.Produto.Preco * cp.Quantidade;
					precoTotal = precoTotal * cp.Quantidade;
					desconto = "0,00";
				}
				else
				{
					total += base.CalcularDesconto(cp.Produto_Especificacao.Produto.Preco,
													cp.Produto_Especificacao.Produto.Produto_Promocao.ToList()[0].Porcentagem) * cp.Quantidade;

					desconto = string.Format("R$ {0}", base.CalcularDesconto(
														cp.Produto_Especificacao.Produto.Preco,
														cp.Produto_Especificacao.Produto.Produto_Promocao.ToList()[0].Porcentagem).toMoneyString());

					precoTotal = base.CalcularDesconto(cp.Produto_Especificacao.Produto.Preco,
														cp.Produto_Especificacao.Produto.Produto_Promocao.ToList()[0].Porcentagem) * cp.Quantidade;
				}

				dt.Rows.Add
				(
					cp.ID,
					"/Imagens/" + cp.Produto_Especificacao.Produto.Foto_Principal,
					string.Format("{0} {1} {2}", cp.Produto_Especificacao.Produto.Produto_Categoria.Descricao,
													cp.Produto_Especificacao.Produto.Produto_Marca.Descricao,
													cp.Produto_Especificacao.Produto.Modelo),
					string.Format("R$ {0}", cp.Produto_Especificacao.Produto.Preco.toMoneyString()),
					string.Format("R$ {0}", desconto),
					string.Format("R$ {0}", precoTotal.toMoneyString())
				);
			}

			lblTotal.Text = "R$ " + total.toMoneyString();

			grdCarrinho.DataSource = dt;
			grdCarrinho.DataBind();
		}
		private void AtualizaCarrinho()
		{
			foreach (GridViewRow row in grdCarrinho.Rows)
			{
				if (row.RowType == DataControlRowType.DataRow)
				{
					int cpID = Convert.ToInt32(row.Cells[0].Text.ToString());
					Carrinho_Produtos cp = new Carrinho_ProdutosDAL().Obter(cpID);
				}
			}
		}

		protected void grdCarrinho_RowDataBound(object sender, GridViewRowEventArgs e)
		{
			if (e.Row.RowType == DataControlRowType.DataRow)
			{
				Int64 myID = Convert.ToInt64(((HiddenField)e.Row.FindControl("hdfID")).Value);
				Carrinho_Produtos cp = new Carrinho_ProdutosDAL().Obter(myID);

				DropDownList ddl = (DropDownList)e.Row.FindControl("ddlQuantidade");

				for (int i = 1; i <= cp.Produto_Especificacao.Quantidade; i++)
				{
					ddl.Items.Add(new ListItem() { Value = i.ToString(), Text = i.ToString() });
				}

				ddl.ClearSelection();
				ddl.Items.FindByValue(cp.Quantidade.ToString()).Selected = true;
			}
		}
		protected void grdCarrinho_RowCommand(object sender, GridViewCommandEventArgs e)
		{
			if (e.CommandName == "remover")
			{
				Int64 myID = Convert.ToInt64(e.CommandArgument.ToString());
				var cpd = new Carrinho_ProdutosDAL();

				cpd.Deletar(cpd.Obter(myID));

				Response.Redirect("Carrinho.aspx");
			}
		}
		protected void ddlQuantidade_SelectedIndexChanged(object sender, EventArgs e)
		{
			try
			{
				foreach (GridViewRow row in grdCarrinho.Rows)
				{
					if (row.RowType == DataControlRowType.DataRow)
					{
						Int64 myID = Convert.ToInt64(((HiddenField)row.FindControl("hdfID")).Value);
						var cpd = new Carrinho_ProdutosDAL();
						Carrinho_Produtos cp = cpd.Obter(myID);
						DropDownList ddl = (DropDownList)row.FindControl("ddlQuantidade");

						if (cp.isNull())
							continue;

						if (ddl.isNull())
							continue;

						cp.Quantidade = Convert.ToInt32(ddl.SelectedItem.Value);
						cpd.Atualizar(cp);
						cp = null;
					}
				}

				Response.Redirect("Carrinho.aspx");
			}
			catch (Exception)
			{
				throw;
			}
		}

		protected void btnFinalizarCompra_Click(object sender, EventArgs e)
		{
			try
			{
				string guid = GenerateCode();
				var pd = new PedidoDAL();

				PaymentRequest payment = new PaymentRequest();
				List<Pedido_Item> lpi = new List<Pedido_Item>();

				foreach (Carrinho_Produtos cp in Cli.Carrinho_Produtos.ToList())
				{
					if (cp.Produto_Especificacao.Produto.Peso == 0)
						throw new ApplicationException("Dimensões não especificadas para este produto!");

					decimal precoTotal = cp.Produto_Especificacao.Produto.Preco;

					if ((cp.Produto_Especificacao.Produto.Produto_Promocao != null) && (cp.Produto_Especificacao.Produto.Produto_Promocao.Count > 0))
						precoTotal = base.CalcularDesconto(
											cp.Produto_Especificacao.Produto.Preco,
											cp.Produto_Especificacao.Produto.Produto_Promocao.ToList()[0].Porcentagem);

					payment.Items.Add(new Item
					(
						cp.Produto_Especificacao.CodigoLoja,
						cp.Produto_Especificacao.Produto.Produto_Marca.Descricao + " " + cp.Produto_Especificacao.Produto.Modelo,
						(int)cp.Quantidade,
						precoTotal,
						cp.Produto_Especificacao.Produto.Peso
					));

					lpi.Add(new Pedido_Item()
					{
						Cliente_ID = Cli.ID,
						Cor = cp.Produto_Especificacao.Cor,
						Data = DateTime.Now,
						Produto_ID = cp.Produto_Especificacao.Produto.ID,
						Quantidade = cp.Quantidade,
						Tamanho = cp.Produto_Especificacao.Tamanho,
						ValorUnitario = cp.Produto_Especificacao.Produto.Preco
					});
				}

				payment.Sender = new Sender(Cli.Nome + " " + Cli.Sobrenome, Cli.Email, new Phone(Cli.DDD_Telefone, Cli.Telefone));

				Cliente_Endereco ce = Cli.Cliente_Endereco.Where(a => a.Ativo == true).SingleOrDefault();

				if ((ce == null) || (ce.ID == 0))
					throw new ApplicationException("");

				payment.Shipping = new Shipping();
				payment.Shipping.ShippingType = ShippingType.Pac;

				payment.Shipping.Address = new Address();
				payment.Shipping.Address.City = ce.Cidades.Nome;
				payment.Shipping.Address.Complement = ce.Complemento;
				payment.Shipping.Address.Country = "BRA";
				payment.Shipping.Address.District = ce.Bairro;
				payment.Shipping.Address.Number = ce.Numero;
				payment.Shipping.Address.PostalCode = ce.CEP;
				payment.Shipping.Address.State = ce.Cidades.Estados.Sigla;
				payment.Shipping.Address.Street = ce.Logradouro;

				payment.Currency = Currency.Brl;
				payment.Reference = guid;

				payment.Sender.Documents.Add(new SenderDocument(Documents.GetDocumentByType("CPF"), Cli.CPF));
				payment.RedirectUri = new Uri("https://www.bybikeshop.com.br/Cliente/SucessoCompra.aspx");

				Pedidos p = new Pedidos();
				p.CodigoPedido = guid;
				p.Data = DateTime.Now;
				p.Cliente_ID = Cli.ID;
				p.ID = new PedidoDAL().Adicionar(p);

				PedidoItemDAL pid = new PedidoItemDAL();

				foreach (var pi in lpi)
				{
					pi.Pedido_ID = p.ID;
					pid.Adicionar(pi);
				}

				Uri paymentRedirectUri = payment.Register(credentials);

				Response.Redirect(paymentRedirectUri.ToString());
			}
			catch (Exception)
			{
				throw;
			}
		}

		protected void btnContinuarComprando_Click(object sender, EventArgs e)
		{
			Response.Redirect("/Site/Pages/Produtos.aspx?" + OUTROS.PAGINA + "=" + Util.Criptografia.Encriptar(SupportLayer.Constantes.CRIPTO.CHAVE, SupportLayer.Constantes.CRIPTO.VETOR, "1"));
		}

		private string GenerateCode()
		{
			int Tamanho = 10; // Numero de digitos da senha
			string senha = string.Empty;
			for (int i = 0; i < Tamanho; i++)
			{
				Random random = new Random();
				int codigo = Convert.ToInt32(random.Next(48, 122).ToString());

				if ((codigo >= 48 && codigo <= 57) || (codigo >= 97 && codigo <= 122))
				{
					string _char = ((char)codigo).ToString();
					if (!senha.Contains(_char))
					{
						senha += _char;
					}
					else
					{
						i--;
					}
				}
				else
				{
					i--;
				}
			}
			return senha;
		}
	}
}